<?php

namespace app\controller;

use app\model\User;
use ReflectionClass;
use support\Request;
use think\facade\Db;
use Tinywan\Jwt\JwtToken;

/**
 * 基础控制器
 */
class Base
{
    protected Request $request;
    protected Db $db; // 数据库实例
    protected ?int $user_id = null; // 登录用户ID
    protected ?User $user = null; // 登录用户信息

    public function __construct()
    {
        $this->request = request();
        $this->db = new Db();

        // 执行初始化逻辑
        $this->initialize();

        // 验证登录，仅在需要登录的情况下进行
        $this->authenticate();
    }

    /**
     * 初始化方法
     * 可用于子类扩展
     */
    protected function initialize()
    {
        // 可由子类扩展实现额外逻辑
    }

    /**
     * 验证登录
     */
    protected function authenticate(): void
    {
        // 获取当前控制器的方法不需要登录的白名单
        $controller = new ReflectionClass($this->request->controller);
        $noNeedLogin = $controller->getDefaultProperties()['noNeedLogin'] ?? [];

        // 如果方法需要登录
        if (!in_array($this->request->action, $noNeedLogin)) {
                // 验证用户身份
            $this->user_id = JwtToken::getCurrentId();
            $this->user = (new User)->findOrFail($this->user_id);
        }
    }

    /**
     * 处理模型数据，去除多余字段
     *
     * @param \app\model\Base $model_data 模型数据
     * @param array $fields 要隐藏的字段
     * @return \app\model\Base
     */
    public function handleModelData(\app\model\Base $model_data, array $fields = ['created_at', 'updated_at', 'deleted_at']): \app\model\Base
    {
        return $model_data->hidden($fields);
    }
}
